#define _CRT_SECURE_NO_WARNINGS
#define FILENAME "d:/employ-data .txt"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include<windows.h>
// 结构体相当于 自己定义一种数据类型 
// int a 的 意思是定义了一个 整型数据类型 a  
// struct info a 的意思是 定义了 struct info 类型的 a  ( 用了 typedef 重命名之后 可以直接写成 info a)
typedef struct info
{
    char name[100];
    int number;
} info; // typedef 的作用是重命名  struct info 重命名为 info （码字方便点）
info a[1000]; //结构体数组 用于保存 一条条信息

int count = 0; // 这个全局 变量 用于记录有多少条数据

// 把数据读入 结构体中
void read()
{
    FILE* pf = fopen(FILENAME, "r");  // 读取失败fopen函数返回 NULL 并设置 错误指示器
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno)); // 打印错误信息
        return ;
    }
    int i = 0;

    char row[80];
    while (fgets(row, 80, pf)) // 每一行 的读取数据
    {
        sscanf(row, "%s%d", a[i].name, &a[i].number); // 格式化数据装入 结构体中
        i++;
        count++;  // 读一行 count++ 以达到计数的目的
    }
    fclose(pf);
    pf = NULL;
}

void swap(info* e1, info* e2)
{
    info tmp = *e1;
    *e1 = *e2;
    *e2 = tmp;
}

void my_sort( ) 
{
    int n = count;
   
    for (int i = 0; i < n - 1; i++)
    {
        int flag = 1; // 表示 预设这一趟完成 排序好了 
    
        for (int j = 0; j < n - 1 - i; j++)
        {
          
            if (a[j].number > a[j + 1].number)
            {
                swap(&a[j], &a[j + 1]);
                flag = 0;  // 进入交换就代表 这一趟结束后 并没排好序
            }
        }
        if (flag)
            break;
    }
}

void write()
{
    FILE* qf = fopen("d:/employ-sort .txt", "w"); // 读取失败fopen函数返回 NULL 并设置 错误指示器
    if (qf == NULL) 
    {
        printf("%s\n", strerror(errno)); // 打印错误指示器
        return;
    }
    char row[100];
    int i = 0;
    while (i < count)
    {
        sprintf(row, "%s\t%d\n", a[i].name, a[i].number); // 把文件中的数据写入结构体数组中 
        printf(row);
        fputs(row, qf);
        i++;
    }
    fclose(qf);
    qf = NULL;
}

void search()
{
    
    char name[100];
    while (1)
    {
        int flag = 0; // 代表没有找到
        printf("请输入你要查询的行业,输入0退出查询哦:");
        if ( strcmp(gets(name),"0") == 0)
            return;
        for (int i = 0; i < count; i++)
        {
            if (strcmp(name, a[i].name) == 0) // 依次比较 两个字符串中 每个字符的ascii码值 做差 等于 0 则说明 两个字符串相等
            {
                printf("找到了以下是查询结果\n");
                Sleep(500); // 睡眠500毫秒
                printf("行业名：%s\t 从业人数：%d\n", a[i].name, a[i].number);
                flag = 1; // 找到了 设置为1
            }
        }
        if(!flag) //出了循环 flag 还是0代表没有找到
            printf("没有查询到该行业哦\n");
        Sleep(500); // 睡眠500毫秒
    }   
}

int main()
{
    read();
    my_sort();
    write();
    search();
    return 0;
}